package com.shujia

object Demo07Func03 {
  // 以函数作为参数的应用
  def main(args: Array[String]): Unit = {
    // 定义一个Array数组，元素的类型为Int类型
    val sourceArr: Array[Int] = Array[Int](1, 2, 3, 4, 5, 6, 7, 8, 9)

    // 遍历数组

    // Java VS Scala

    // 在Java中可以使用for i、增强for、循环进行遍历
    for (i <- sourceArr) {
      println(i)
    }

    println("#" * 50)

    // Int => Unit
    def printInt(i: Int): Unit = {
      println(i)
    }




    // 在Scala中 采用函数式编程的思想
    /**
     * 使用foreach方法
     * 该方法需要接收一个函数f
     * 函数f: Int => Unit
     * println函数：Any => Unit
     *
     */
    sourceArr.foreach(println)

    // 将Array数组中的每个元素*2 构建一个新的数组

    // Java的方式

    // 定义一个新的Array，长度同sourceArr保持一致
    val newArr: Array[Int] = new Array[Int](sourceArr.length)
    var index: Int = 0
    while (index < sourceArr.length) {
      newArr(index) = sourceArr(index) * 2
      index += 1
    }
    println(newArr.toList)

    // Scala的方式

    /**
     * map VS foreach
     * 有无返回值
     * 都需要接收一个函数f，会将数组中的每个元素依次传给该函数f
     * 只不过函数f的返回值类型不同
     * foreach方法接收的函数f无返回值
     * map方法接收的函数f需要的返回值类型为B（相当于自己定义，传入的函数f返回值类型是什么则B就是什么类型）
     *
     */

    def f(i: Int): Int = {
      i * 2
    }

    val newArrScala: Array[Int] = sourceArr.map(f)

    println(newArrScala.toList)

    // 使用匿名函数进行简写
    println(sourceArr.map(_ * 2).toList)


  }

}
